package com.vonzhou.springinaction.knights;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 首先，Minstrel仍然是一个POJO，没有任何代码表明它要被作为一个切面使用。当我们按照上面那样进行配置后，在Spring的上下文中，Minstrel实际上已经变成一个切面了。
 * <p>
 * 其次，也是最重要的，Minstrel可以被应用到BraveKnight中，而BraveKnight不需要显式地调用它。实际上，BraveKnight完全不知道Minstrel的存在。
 * <p>
 * 必须还要指出的是，尽管我们使用Spring魔法把Minstrel转变为一个切面，但首先要把它声明为一个Spring bean。能够为其他Spring bean做到的事情都可以同样应用到Spring切面中，例如为它们注入依赖。
 */
public class KnightAopMain {
	public static void main(String[] args) {
		// Spring应用上下文（Application Context）全权负责对象的创建和组装。创建应用组件之间协作的行为通常称为装配（wiring）。
		//lxd: 加载knights.xml,加载Spring应用上下文（Application Context）装载bean的定义并把它们组装起来.
		// 创建应用组件之间协作的行为通常称为装配（wiring）
		ApplicationContext context =
				new ClassPathXmlApplicationContext("knights-aop.xml");

		Knight knight = (Knight) context.getBean("knight");
		//并获得Knight对象的引用。
		knight.embarkOnQuest();
	}
}
